/**
 * @file serial.h
 * @brief 串口通信驱动接口头文件
 * @author 废话文学创始人
 * @version 1.0
 * @date 2024-02-25
 */

#ifndef __SERIAL_H__
#define __SERIAL_H__
#include "main.h"

#include <stdio.h>
#include <stdarg.h>
#include <string.h>

/**
 * @def TXBUFFERSIZE
 * @brief 输出字符串的最大长度
 */
#define TXBUFFERSIZE 100

/**
 * @def RXBUFFERSIZE
 * @brief 接收字符串的最大长度
 */
#define RXBUFFERSIZE 200

/**
 * @def TIMEOUT
 * @brief 串口操作超时时间
 */
#define TIMEOUT HAL_MAX_DELAY

#ifdef NDEBUG
/**
 * @def UartSendString
 * @brief 串口发送字符串（调试模式下为格式化发送，非调试模式下为空）
 */
#define UartSendString
#else
#define UartSendString Uart_FormatSend_unblock
#endif

/**
 * @brief 格式化阻塞发送字符串到串口
 * @param huart 串口句柄
 * @param format 格式化字符串
 * @param ... 可变参数
 */
void Uart_FormatSend_block(UART_HandleTypeDef *huart, const char *format, ...);

/**
 * @brief 格式化非阻塞发送字符串到串口
 * @param huart 串口句柄
 * @param format 格式化字符串
 * @param ... 可变参数
 */
void Uart_FormatSend_unblock(UART_HandleTypeDef *huart, const char *format, ...);

/**
 * @brief 阻塞方式接收数据到缓冲区
 * @param huart 串口句柄
 * @param RxLen_finally 最终接收长度指针
 */
void Uart_ReceiveToBuffer_block(UART_HandleTypeDef *huart, uint16_t *RxLen_finally);

/**
 * @brief 非阻塞方式接收数据到缓冲区
 * @param huart 串口句柄
 */
void Uart_ReceiveToBuffer_unblock(UART_HandleTypeDef *huart);

#endif /*__SERIAL_H__ */